package br.foton.la.agenda.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.foton.la.agenda.enums.EnumStatusViagem;

@NamedQueries(value = {
		@NamedQuery(name = Viagem.GET_BY_RANGE_DT_SAIDA, query = "select v from Viagem v where v.dataSaida between :dataSaidaMin and :dataSaidaMax"),
		@NamedQuery(name = Viagem.GET_BY_RANGE_DT_CHEGADA, query = "select v from Viagem v where v.dataChegada between :dataChegadaMin and :dataChegadaMax"),
		@NamedQuery(name = Viagem.GET_BY_DT_CHEGADA, query = "select v from Viagem v where v.dataChegada = :dataChegada"),
		@NamedQuery(name = Viagem.GET_BY_DT_SAIDA, query = "select v from Viagem v where v.dataSaida = :dataSaida"),
		@NamedQuery(name = Viagem.GET_BY_DESTINO, query = "select v from Viagem v where v.destino = :destino")})
@Entity
@SequenceGenerator(name = "viagemGenerator", sequenceName = "VIAGEM_SEQ", allocationSize = 1)
public class Viagem implements Serializable{
	private static final long serialVersionUID = 1L;
	public static final String GET_BY_RANGE_DT_SAIDA = "Viagem.GET_BY_RANGE_DT_SAIDA";
	public static final String GET_BY_RANGE_DT_CHEGADA = "Viagem.GET_BY_RANGE_DT_CHEGADA";
	public static final String GET_BY_DT_CHEGADA = "Viagem.GET_BY_DT_CHEGADA";
	public static final String GET_BY_DT_SAIDA = "Viagem.GET_BY_DT_SAIDA";
	public static final String GET_BY_DESTINO = "Viagem.GET_BY_DESTINO";

	@Id
	@GeneratedValue(generator = "viagemGenerator", strategy = GenerationType.SEQUENCE)
	private Integer id;
	@Column(nullable = false, length = 50)
	private String origem;
	@Column(nullable = false, length = 50)
	private String destino;
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "dt_saida")
	private Date dataSaida;
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "dt_chegada")
	private Date dataChegada;
	@Column(name = "valor_frete", columnDefinition = "Decimal(6,2)")
	private double frete;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "viagem")
	private List<Gasto> gastos;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "viagem")
	private List<Carro> carros;
	@ManyToOne(cascade=CascadeType.ALL)
	@JoinColumn(name = "motorista_id")
	private Motorista motorista;
	@Enumerated(EnumType.ORDINAL)
	private EnumStatusViagem statusViagem;
	@Column(columnDefinition="TEXT")
	private String observacoes;

	public Viagem(String origem, String destino, double frete) {
		setOrigem(origem);
		setDestino(destino);
		setFrete(frete);
		setStatusViagem(EnumStatusViagem.NA_ESTRADA);
	}

	public Viagem() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public String toString() {
		return "Viagem [id=" + id + ", origem=" + origem + ", destino="
				+ destino + ", dataSaida=" + dataSaida + ", dataChegada="
				+ dataChegada + ", frete=" + frete + ", carros=" + carros + "]";
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getOrigem() {
		return origem;
	}

	public void setOrigem(String origem) {
		this.origem = origem;
	}

	public String getDestino() {
		return destino;
	}

	public void setDestino(String destino) {
		this.destino = destino;
	}

	public Date getDataSaida() {
		return dataSaida;
	}

	public void setDataSaida(Date dataSaida) {
		this.dataSaida = dataSaida;
	}

	public Date getDataChegada() {
		return dataChegada;
	}

	public void setDataChegada(Date dataChegada) {
		this.dataChegada = dataChegada;
	}

	public double getFrete() {
		return frete;
	}

	public void setFrete(double frete) {
		this.frete = frete;
	}

	public List<Gasto> getGastos() {
		return gastos;
	}

	public void setGastos(List<Gasto> gastos) {
		this.gastos = gastos;
	}

	public List<Carro> getCarros() {
		return carros;
	}

	public void setCarros(List<Carro> carros) {
		this.carros = carros;
	}

	public Motorista getMotorista() {
		return motorista;
	}

	public void setMotorista(Motorista motorista) {
		this.motorista = motorista;
	}

	public EnumStatusViagem getStatusViagem() {
		return statusViagem;
	}

	public void setStatusViagem(EnumStatusViagem statusViagem) {
		this.statusViagem = statusViagem;
	}

	public String getObservacoes() {
		return observacoes;
	}

	public void setObservacoes(String observacoes) {
		this.observacoes = observacoes;
	}

}
